


package com.UMLife.me.action;

import javax.microedition.midlet.MIDlet;
import com.UMLife.me.global.Global;
import com.UMLife.me.model.LoginModel;
import com.UMLife.me.ui.ForgetPswUI;
import com.UMLife.me.ui.LoginUI;
import com.UMLife.me.ui.RegisterUI;
import de.enough.polish.ui.Alert;
import de.enough.polish.ui.AlertType;
import de.enough.polish.ui.Command;
import de.enough.polish.ui.CommandListener;
import de.enough.polish.ui.Display;
import de.enough.polish.ui.Displayable;





/**
 * Class Information:
 * 
 * @Author yangguang
 * @Date 2009-11-8
 * @Description 这个类用来处理LoginUI上的事件，具体内容有：
 *              <p>
 *              1.处理退出事件，退出时弹出一个Alert，alert上有退出和取消按钮，并对
 *              <p>
 *              alert进行了事件处理
 *              <p>
 *              2.处理忘记密码事件，将界面转到ForgetPswUI界面进行处理
 *              <p>
 *              3.处理注册事件 ，将界面转到RegisterUI界面进行处理
 *              <p>
 *              4.处理登录事件，通 过model进行密码和用户的验证，如果合法，则转移到
 *              <p>
 *              主体框架部分，如果不合法，弹出一个 提示框，提示出现错误并重新输入 。
 *              <p>
 *              5.自动登录： 实现自动登录功能很简单，只要使用者调用selfLogin()方法即可
 *              <p>
 * @MustDos 有些事件需要处理：
 *          <p>
 *          1.UI层与Action层之间的漏洞：在处理Item事件的时候：例如自动登录功能由谁来
 *          <p>
 *          处理，这就没有统一的规定。在这里，我采用记录存储的方式进行，将这些信息存
 *          <p>
 *          储在RecordStore之中。具体用法详见LoginData类。
 *          <p>
 *          2.在对Item进行操作的时候，本人采用ItemStateListener的方式进行监听，这里
 *          <p>
 *          需要UI层提供ChoiceGroup而不是getLoginFlag()。需要和其他人协同一下。
 */

public class LoginAction implements CommandListener
{
	
	/**
	 * @param choice
	 */
	public LoginAction(LoginUI login)
	{
		
		this.init(login);
		
		this.addCommand();
		
	}
	
	/**
	 * 处理按钮事件
	 */
	public void commandAction(Command c, Displayable d)
	{
		if (d == this.login)// LoginUI界面上的事件处理
		{
			if (c == this.cmdExit)
			{
				this.exitAction();
				
			}
			if (c == this.cmdForgetPsw)
			{
				
				ForgetPswUI getPassWord = Global.getForgetPswUI();
				this.display.setCurrent(getPassWord);
			}
			if (c == this.cmdRegister)
			{
				
				RegisterUI register = Global.getRegisterUI();
				this.display.setCurrent(register);
			}
			if (c == this.cmdOk)
			{
				this.okAction();
				
			}
		}
		if (d == this.alert)// Alert 界面上的事件处理
		{
			if (c == LoginAction.this.cmdExit)
			{
				this.midlet.notifyDestroyed();
			}
			if (c == LoginAction.this.cmdCancel)
			{
				this.display.setCurrent(LoginAction.this.login);
			}
		}
		
	}
	
	/**
	 * 该方法实现自动登录功能
	 */
	public void selfLogin()
	{
		this.commandAction(this.cmdOk, this.login);
	}
	
	/********************** 实现细节部分，使用者不用关心 ***********************/
	
	private void addCommand()
	{
		this.login.addCommand(this.cmdForgetPsw);
		this.login.addCommand(this.cmdExit);
		this.login.addCommand(this.cmdOk);
		this.login.addCommand(this.cmdRegister);
	}
	
	/**
	 * 点击LoginUI的cmdExit激发的动作
	 */
	private void exitAction()
	{
		this.alert = new Alert("提示", "退出？", null, AlertType.ALARM);
		this.alert.addCommand(this.cmdExit);
		this.alert.addCommand(this.cmdCancel);
		this.alert.setCommandListener(this);
		this.alert.setTimeout(Alert.FOREVER);
		this.display.setCurrent(this.alert);
	}
	
	/**
	 * 初始化方法
	 */
	private void init(LoginUI login)
	{
		this.login = login;
		this.model = Global.getLoginModel();
		this.display = Global.getGlobalDisplay();
		this.midlet = Global.getGlobalMIDlet();
		this.cmdCancel = Global.getCmdCancel();
		this.cmdForgetPsw = new Command("忘记密码", Command.OK, 3);
		this.cmdRegister = new Command("申请账号", Command.OK, 2);
		this.cmdExit = Global.getCmdExit();
		this.cmdOk = new Command("登陆", Command.OK, 1);
	}
	
	/**
	 * 点击cmdOk后所激发的事件
	 */
	private void okAction()
	{
		/*
		 * boolean legal = this.model.login(this.login.getName(), this.login
		 * .getPassword());
		 * if (legal)
		 * {
		 * this.saveLoginData();
		 * this.beginGame();
		 * }
		 * if (!legal)
		 * {
		 * this.alert = new Alert("错误", "您输入的用户名或密码存在问题，请重新输入", null,
		 * AlertType.ALARM);
		 * this.alert.setTimeout(LoginAction.alertLastTime);
		 * this.display.setCurrent(this.alert, this.login);
		 * }
		 */
		Alert alert = new Alert("测试说明\n");
		alert.setInfo("由于登录时必须要经过网络连接，现在无法用来进行测试，故，直接链接到答题界面。");
		this.display.setCurrent(alert, Global.getMainMenu());
		this.saveLoginData();
	}
	
	/**
	 * 保存登录信息
	 */
	private void saveLoginData()
	{
		Thread dataSaveAction = new Thread()
		{
			
			public void run()
			{
				LoginData loginData = LoginData.getLoginData();
				loginData.setUserName(LoginAction.this.login.getName());
				loginData.setPassword(LoginAction.this.login.getPassword());
				boolean[] flags = LoginAction.this.login.getLoginFlag();
				loginData.setSelfLogin(flags[0]);
				loginData.setSelfLogin(flags[1]);
				loginData.save();
			}
			
		};
		dataSaveAction.start();
	}
	
	private static final int	alertLastTime	= 1000;
	
	private Alert				alert;
	
	private Command				cmdCancel;
	
	private Command				cmdExit;
	
	private Command				cmdForgetPsw;
	
	private Command				cmdOk;
	
	private Command				cmdRegister;
	
	private Display				display;
	
	private LoginUI				login;
	
	private MIDlet				midlet;
	
	private LoginModel			model;
	
}
